using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 表示游戏中的一个"增益/特殊能力"（Perk），负责管理自身激活条件检测与效果触发逻辑
/// </summary>
public class Perk
{
    /// <summary>
    /// 该增益能力的图标（仅可读，通过数据配置初始化）
    /// </summary>
    public Sprite Image { get; private set; }

    /// <summary>
    /// 关联的核心数据配置（包含图标、条件、效果等具体参数）
    /// </summary>
    private readonly PerkData data;

    /// <summary>
    /// 条件检测组件（负责订阅/取消条件事件，并判断子条件是否满足）
    /// </summary>
    private readonly PerkCondition condition;

    /// <summary>
    /// 效果执行组件（负责目标选择逻辑与最终效果动作的生成）
    /// </summary>
    private readonly AutoTargetEffect effect;

    /// <summary>
    /// 构造函数：通过数据配置初始化增益能力实例
    /// </summary>
    /// <param name="perkData">包含该增益能力所有配置数据的对象</param>
    public Perk(PerkData perkData)
    {
        data = perkData;                  // 存储核心数据配置
        Image = perkData.Image;           // 初始化图标（直接从数据配置获取）
        condition = perkData.PerkCondition; // 获取关联的条件检测组件
        effect = perkData.AutoTargetEffect; // 获取关联的效果执行组件
    }

    /// <summary>
    /// 当增益能力被激活/添加时调用（例如角色获得该增益时）
    /// </summary>
    public void OnAdd()
    {
        // 订阅条件检测事件：当条件可能触发时，调用Reaction方法进行检测
        condition.SubscribeCondition(Reaction);
    }

    /// <summary>
    /// 当增益能力被移除/失效时调用（例如角色失去该增益时）
    /// </summary>
    public void OnRemove()
    {
        // 取消订阅条件检测事件：停止对该增益能力的条件监听
        condition.UnsubscribeCondition(Reaction);
    }

    /// <summary>
    /// 条件触发时的回调方法（由PerkCondition在检测到可能触发的事件时调用）
    /// </summary>
    /// <param name="gameAction">触发条件检测的游戏动作（可能包含来源角色、目标等信息）</param>
    private void Reaction(GameAction gameAction)
    {
        // 第一步：检查当前游戏动作是否满足该增益能力的子条件（例如特定类型动作、特定阶段等）
        if (condition.SubConditionIsMet(gameAction))
        {
            // 初始化目标列表（用于存储该次效果要作用的目标）
            List<CombatantView> targets = new();

            // 情况1：如果配置了"使用动作施法者作为目标"，且当前游戏动作包含施法者信息
            if (data.UseActionCasterAsTarget && gameAction is IHaveCaster haveCaster)
            {
                // 将施法者（例如释放该动作的角色）添加为目标
                targets.Add(haveCaster.Caster);
            }

            // 情况2：如果配置了"自动选择目标"，则通过效果组件的目标模式获取目标
            if (data.UseAutoTarget)
            {
                // 调用效果组件的目标选择模式（如单体、全体、敌方等）获取实际目标列表，并添加到总目标列表
                targets.AddRange(effect.TargetMode.GetTargets());
            }

            // 生成该增益能力对应的具体游戏动作（例如造成伤害、治疗、附加状态等）
            // 参数说明：目标列表、当前英雄视图（可能用于获取施法者或上下文信息）
            GameAction perkEffectAction = effect.Effect.GetGameAction(targets, HeroSystem.instance.HeroView);

            // 将生成的增益效果动作添加到游戏动作系统，触发实际效果执行
            ActionSystem.instance.AddReaction(perkEffectAction);
        }
    }
}